﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dominio.Logica;
using Dominio.Excepciones;

namespace Dominio.Entidades
{
    partial class Usuarios
    {
        public List<Usuarios> RecuperarUsuarios()
        {
            AgenciaEntities contexto = Contexto.GetContexto();
            List<Usuarios> listaUsuarios = contexto.Usuarios.ToList();
            
            return listaUsuarios;
        }

        public Usuarios GetUsuariosByName(string nombre)
        {
            AgenciaEntities contexto = Contexto.GetContexto();
            Usuarios user = null;
            try
            {
                user = contexto.Usuarios.Where(o => o.Nombre == nombre).First();
                if (user.Activo == false) 
                {
                    throw new NoUserFoundException();
                }
            }
            catch (Exception)
            {
                throw new NoUserFoundException();
            }

            return user;
        }

        public void GuardarUsuario()
        {
            AgenciaEntities contexto = Contexto.GetContexto();
            Usuarios user = null;
            try
            {
                user = contexto.Usuarios.Where(o => o.Nombre == this.Nombre).FirstOrDefault();
                if (user!=null)
                {
                    user = contexto.Usuarios.Where(o => o.Nombre == this.Nombre).First();
                    if (user.Activo == false)
                    {
                        user.Activo = true;
                        user.Permisos = this.Permisos;
                        user.Password = Encriptador.EncryptStringAES(this.Password, "");
                        contexto.SaveChanges();
                    }
                }
                else 
                {
                    this.Password = Encriptador.EncryptStringAES(this.Password, "");
                    contexto.Usuarios.AddObject(this);
                    contexto.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                
                throw ex;
            }

        }

        public void EliminarUsuario()
        {
            AgenciaEntities contexto = Contexto.GetContexto();
            try
            {
                Usuarios user = contexto.Usuarios.First(i => i.IdUsuario == this.IdUsuario);
                this.Activo = false;
                contexto.SaveChanges();
            }
            catch (Exception) 
            {
                throw new NoUserFoundException();
            }
        }

        public void ActualizarUsuario(bool pass, bool permiso) 
        {
            AgenciaEntities contexto = Contexto.GetContexto();
            Usuarios user = contexto.Usuarios.First(i => i.IdUsuario == this.IdUsuario);
            if (pass) user.Password = Encriptador.EncryptStringAES(this.Password,"");
            if (permiso) user.Permisos = this.Permisos;
            contexto.SaveChanges();
        }

        public override string ToString()
        {
            return this.Nombre;
        }

        public bool Validar(string nombre, string pass)
        {
            //Compruebo si existe el usuario, si está ACTIVO y si la clave es correcta.
            bool retorno = false;
            Usuarios u = null;
            try
            {
                u = GetUsuariosByName(nombre);
            }
            catch (NoUserFoundException ex)
            {
                throw ex;
            }

            try
            {
                if (Encriptador.DecryptStringAES(u._Password, "").Equals(pass))
                {
                    retorno = true;
                }

                else
                {
                    throw new IncorrectPasswordException();
                }
            }
            catch (IncorrectPasswordException)
            {
                throw new IncorrectPasswordException();
            }

            return retorno;
        }

        public void ValidarAlta() 
        {
            List<Usuarios> aux = Contexto.GetContexto().Usuarios.ToList();

            //Nombre vacio
            if (this.Nombre.Trim().Equals("")) throw new EmptyUserNameException();
            //Nombre existente            
            if (aux.Exists(o => o.Nombre.Equals(this.Nombre)) && aux.Find(p => p.Nombre.Equals(this.Nombre)).Activo==true) throw new ExistingUserNameException();
            //Contraseña vacía
            if (this.Password.Trim().Equals("")) throw new EmptyUserPasswordException();

        }

        public void ValidarModificacion()
        {
            List<Usuarios> aux = Contexto.GetContexto().Usuarios.ToList();

            //Nombre vacio
            if (this.Nombre.Trim().Equals("")) throw new EmptyUserNameException();
            //Nombre existente            
            if (aux.Exists(o => o.Nombre.Equals(this.Nombre)) && aux.Find(p => p.Nombre.Equals(this.Nombre)).Activo == false) throw new NoUserFoundException();
            //Contraseña vacía
            if (this.Password.Trim().Equals("")) throw new EmptyUserPasswordException();

        }

        public static List<Usuarios> RecuperarUsuariosActivos()
        {
            AgenciaEntities contexto = Contexto.GetContexto();
            List<Usuarios> aux = contexto.Usuarios.ToList();
            List<Usuarios> usuariosActivos = new List<Usuarios>();
            foreach (Usuarios u in aux) 
            {
                if (u.Activo == true) 
                {
                    usuariosActivos.Add(u);
                }
            }
            return usuariosActivos;
        }
    }
}
